{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据预处理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现实的数据往往是充满噪声的，而没有高质量的数据，就没有高质量的数据挖掘结果。所以，我们需要对数据进行预处理，以提高数据的质量。\n",
    "\n",
    "数据的质量涉及许多因素，包括：\n",
    "- 准确性\n",
    "- 完整性\n",
    "- 一致性\n",
    "- 时效性\n",
    "- 可信性\n",
    "- 可解释性\n",
    "\n",
    "数据预处理的主要步骤为：\n",
    "- 数据清理：通过填写缺失值、光滑噪声数据、识别或删除离群点。并解决不一致性来“清理”数据\n",
    "- 数据集成：将多个数据源、数据库集成在一个\n",
    "- 数据规约：将得到的数据进行简化，去除冗余数据\n",
    "- 数据变换：讲数据进行规范化、数据离散化和数据分层，可以使得数据挖掘在多个抽象层次上进行。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.数据清洗\n",
    "\n",
    "现实中的数据一般是不完整的、有噪声的和不一致的。**数据清洗**试图填充缺失值、光滑噪声并识别离群点和纠正数据中的不一致。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.1 缺失值\n",
    "有时候我们获取的数据存在缺失值，这个往往用NaN来表示。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>first_name</th>\n",
       "      <th>last_name</th>\n",
       "      <th>age</th>\n",
       "      <th>sex</th>\n",
       "      <th>preTestScore</th>\n",
       "      <th>postTestScore</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Miller</td>\n",
       "      <td>42.0</td>\n",
       "      <td>m</td>\n",
       "      <td>4.0</td>\n",
       "      <td>25.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Tina</td>\n",
       "      <td>Ali</td>\n",
       "      <td>36.0</td>\n",
       "      <td>f</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Jake</td>\n",
       "      <td>Milner</td>\n",
       "      <td>24.0</td>\n",
       "      <td>m</td>\n",
       "      <td>2.0</td>\n",
       "      <td>62.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Amy</td>\n",
       "      <td>Cooze</td>\n",
       "      <td>73.0</td>\n",
       "      <td>f</td>\n",
       "      <td>3.0</td>\n",
       "      <td>70.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  first_name last_name   age  sex  preTestScore  postTestScore\n",
       "0      Jason    Miller  42.0    m           4.0           25.0\n",
       "1        NaN       NaN   NaN  NaN           NaN            NaN\n",
       "2       Tina       Ali  36.0    f           NaN            NaN\n",
       "3       Jake    Milner  24.0    m           2.0           62.0\n",
       "4        Amy     Cooze  73.0    f           3.0           70.0"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "raw_data = {'first_name': ['Jason', np.nan, 'Tina', 'Jake', 'Amy'], \n",
    "        'last_name': ['Miller', np.nan, 'Ali', 'Milner', 'Cooze'], \n",
    "        'age': [42, np.nan, 36, 24, 73], \n",
    "        'sex': ['m', np.nan, 'f', 'm', 'f'], \n",
    "        'preTestScore': [4, np.nan, np.nan, 2, 3],\n",
    "        'postTestScore': [25, np.nan, np.nan, 62, 70]}\n",
    "df = pd.DataFrame(raw_data)\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 忽略缺失值\n",
    "当缺失值较少的时候，我们可以丢弃缺失的元组，而缺失值较多的时候，我们需要采取别的方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>first_name</th>\n",
       "      <th>last_name</th>\n",
       "      <th>age</th>\n",
       "      <th>sex</th>\n",
       "      <th>preTestScore</th>\n",
       "      <th>postTestScore</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   first_name  last_name    age    sex  preTestScore  postTestScore\n",
       "0       False      False  False  False         False          False\n",
       "1        True       True   True   True          True           True\n",
       "2       False      False  False  False          True           True\n",
       "3       False      False  False  False         False          False\n",
       "4       False      False  False  False         False          False"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 判断缺失值\n",
    "df.isnull()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>first_name</th>\n",
       "      <th>last_name</th>\n",
       "      <th>age</th>\n",
       "      <th>sex</th>\n",
       "      <th>preTestScore</th>\n",
       "      <th>postTestScore</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Miller</td>\n",
       "      <td>42.0</td>\n",
       "      <td>m</td>\n",
       "      <td>4.0</td>\n",
       "      <td>25.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Jake</td>\n",
       "      <td>Milner</td>\n",
       "      <td>24.0</td>\n",
       "      <td>m</td>\n",
       "      <td>2.0</td>\n",
       "      <td>62.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Amy</td>\n",
       "      <td>Cooze</td>\n",
       "      <td>73.0</td>\n",
       "      <td>f</td>\n",
       "      <td>3.0</td>\n",
       "      <td>70.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  first_name last_name   age sex  preTestScore  postTestScore\n",
       "0      Jason    Miller  42.0   m           4.0           25.0\n",
       "3       Jake    Milner  24.0   m           2.0           62.0\n",
       "4        Amy     Cooze  73.0   f           3.0           70.0"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 删除缺失值所在的元组（行）\n",
    "df.dropna(axis=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 人工填写缺失值\n",
    "该方法对少数缺失值有效，但费时，且当数据非常大时难以实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>first_name</th>\n",
       "      <th>last_name</th>\n",
       "      <th>age</th>\n",
       "      <th>sex</th>\n",
       "      <th>preTestScore</th>\n",
       "      <th>postTestScore</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Miller</td>\n",
       "      <td>42.0</td>\n",
       "      <td>m</td>\n",
       "      <td>4.0</td>\n",
       "      <td>25.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>30.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Tina</td>\n",
       "      <td>Ali</td>\n",
       "      <td>36.0</td>\n",
       "      <td>f</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Jake</td>\n",
       "      <td>Milner</td>\n",
       "      <td>24.0</td>\n",
       "      <td>m</td>\n",
       "      <td>2.0</td>\n",
       "      <td>62.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Amy</td>\n",
       "      <td>Cooze</td>\n",
       "      <td>73.0</td>\n",
       "      <td>f</td>\n",
       "      <td>3.0</td>\n",
       "      <td>70.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  first_name last_name   age  sex  preTestScore  postTestScore\n",
       "0      Jason    Miller  42.0    m           4.0           25.0\n",
       "1        NaN       NaN  30.0  NaN           NaN            NaN\n",
       "2       Tina       Ali  36.0    f           NaN            NaN\n",
       "3       Jake    Milner  24.0    m           2.0           62.0\n",
       "4        Amy     Cooze  73.0    f           3.0           70.0"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 将序号 1 的年龄填写为30\n",
    "df_manual = df.copy()\n",
    "df_manual.loc[1,'age'] = 30\n",
    "df_manual"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 使用一个全局常量填充缺失值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>first_name</th>\n",
       "      <th>last_name</th>\n",
       "      <th>age</th>\n",
       "      <th>sex</th>\n",
       "      <th>preTestScore</th>\n",
       "      <th>postTestScore</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Miller</td>\n",
       "      <td>42.0</td>\n",
       "      <td>m</td>\n",
       "      <td>4.0</td>\n",
       "      <td>25.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>999</td>\n",
       "      <td>999</td>\n",
       "      <td>999.0</td>\n",
       "      <td>999</td>\n",
       "      <td>999.0</td>\n",
       "      <td>999.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Tina</td>\n",
       "      <td>Ali</td>\n",
       "      <td>36.0</td>\n",
       "      <td>f</td>\n",
       "      <td>999.0</td>\n",
       "      <td>999.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Jake</td>\n",
       "      <td>Milner</td>\n",
       "      <td>24.0</td>\n",
       "      <td>m</td>\n",
       "      <td>2.0</td>\n",
       "      <td>62.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Amy</td>\n",
       "      <td>Cooze</td>\n",
       "      <td>73.0</td>\n",
       "      <td>f</td>\n",
       "      <td>3.0</td>\n",
       "      <td>70.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  first_name last_name    age  sex  preTestScore  postTestScore\n",
       "0      Jason    Miller   42.0    m           4.0           25.0\n",
       "1        999       999  999.0  999         999.0          999.0\n",
       "2       Tina       Ali   36.0    f         999.0          999.0\n",
       "3       Jake    Milner   24.0    m           2.0           62.0\n",
       "4        Amy     Cooze   73.0    f           3.0           70.0"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 用999填充缺失值\n",
    "df.fillna(value=999)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 使用属性中心度填充缺失值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>first_name</th>\n",
       "      <th>last_name</th>\n",
       "      <th>age</th>\n",
       "      <th>sex</th>\n",
       "      <th>preTestScore</th>\n",
       "      <th>postTestScore</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Miller</td>\n",
       "      <td>42.00</td>\n",
       "      <td>m</td>\n",
       "      <td>4.0</td>\n",
       "      <td>25.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>43.75</td>\n",
       "      <td>NaN</td>\n",
       "      <td>3.0</td>\n",
       "      <td>52.333333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Tina</td>\n",
       "      <td>Ali</td>\n",
       "      <td>36.00</td>\n",
       "      <td>f</td>\n",
       "      <td>3.0</td>\n",
       "      <td>52.333333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Jake</td>\n",
       "      <td>Milner</td>\n",
       "      <td>24.00</td>\n",
       "      <td>m</td>\n",
       "      <td>2.0</td>\n",
       "      <td>62.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Amy</td>\n",
       "      <td>Cooze</td>\n",
       "      <td>73.00</td>\n",
       "      <td>f</td>\n",
       "      <td>3.0</td>\n",
       "      <td>70.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  first_name last_name    age  sex  preTestScore  postTestScore\n",
       "0      Jason    Miller  42.00    m           4.0      25.000000\n",
       "1        NaN       NaN  43.75  NaN           3.0      52.333333\n",
       "2       Tina       Ali  36.00    f           3.0      52.333333\n",
       "3       Jake    Milner  24.00    m           2.0      62.000000\n",
       "4        Amy     Cooze  73.00    f           3.0      70.000000"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 给定元组均值\n",
    "df.fillna(value=df.mean())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 使用最可能的值填充缺失值\n",
    "可使用是回归、贝叶斯等方法确定最可能的值。也可以使用插值法填充。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>first_name</th>\n",
       "      <th>last_name</th>\n",
       "      <th>age</th>\n",
       "      <th>sex</th>\n",
       "      <th>preTestScore</th>\n",
       "      <th>postTestScore</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Miller</td>\n",
       "      <td>42.0</td>\n",
       "      <td>m</td>\n",
       "      <td>4.0</td>\n",
       "      <td>25.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Miller</td>\n",
       "      <td>42.0</td>\n",
       "      <td>m</td>\n",
       "      <td>4.0</td>\n",
       "      <td>25.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Tina</td>\n",
       "      <td>Ali</td>\n",
       "      <td>36.0</td>\n",
       "      <td>f</td>\n",
       "      <td>4.0</td>\n",
       "      <td>25.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Jake</td>\n",
       "      <td>Milner</td>\n",
       "      <td>24.0</td>\n",
       "      <td>m</td>\n",
       "      <td>2.0</td>\n",
       "      <td>62.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Amy</td>\n",
       "      <td>Cooze</td>\n",
       "      <td>73.0</td>\n",
       "      <td>f</td>\n",
       "      <td>3.0</td>\n",
       "      <td>70.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  first_name last_name   age sex  preTestScore  postTestScore\n",
       "0      Jason    Miller  42.0   m           4.0           25.0\n",
       "1      Jason    Miller  42.0   m           4.0           25.0\n",
       "2       Tina       Ali  36.0   f           4.0           25.0\n",
       "3       Jake    Milner  24.0   m           2.0           62.0\n",
       "4        Amy     Cooze  73.0   f           3.0           70.0"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 使用上一个值替代\n",
    "df.fillna(method='ffill')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>first_name</th>\n",
       "      <th>last_name</th>\n",
       "      <th>age</th>\n",
       "      <th>sex</th>\n",
       "      <th>preTestScore</th>\n",
       "      <th>postTestScore</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Miller</td>\n",
       "      <td>42.0</td>\n",
       "      <td>m</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>25.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>39.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>3.333333</td>\n",
       "      <td>37.333333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Tina</td>\n",
       "      <td>Ali</td>\n",
       "      <td>36.0</td>\n",
       "      <td>f</td>\n",
       "      <td>2.666667</td>\n",
       "      <td>49.666667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Jake</td>\n",
       "      <td>Milner</td>\n",
       "      <td>24.0</td>\n",
       "      <td>m</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>62.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Amy</td>\n",
       "      <td>Cooze</td>\n",
       "      <td>73.0</td>\n",
       "      <td>f</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>70.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  first_name last_name   age  sex  preTestScore  postTestScore\n",
       "0      Jason    Miller  42.0    m      4.000000      25.000000\n",
       "1        NaN       NaN  39.0  NaN      3.333333      37.333333\n",
       "2       Tina       Ali  36.0    f      2.666667      49.666667\n",
       "3       Jake    Milner  24.0    m      2.000000      62.000000\n",
       "4        Amy     Cooze  73.0    f      3.000000      70.000000"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "##使用线性插值法填充\n",
    "df.interpolate()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.2 噪声数据\n",
    "噪声（noise）是被测量的变量的随机误差或方差。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 分箱（binning）\n",
    "分箱通过查考数据的“临近”即周围值来光滑有序数据值。由于分箱方法考察邻近值，因此它进行的是局部光滑。\n",
    "\n",
    "将数据分为$n$个等频的箱中，可以用**箱均值**、**箱中位数**或**箱边界**光滑数据。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([15,  4,  8, 21, 28, 21, 24, 25, 34])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_price = np.array([15,4,8,21,28,21,24,25,34])\n",
    "data_price"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 4,  8, 15, 21, 21, 24, 25, 28, 34])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 对数据进行排序\n",
    "data_price.sort()\n",
    "data_price"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 4,  8, 15],\n",
       "       [21, 21, 24],\n",
       "       [25, 28, 34]])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 将数据进行分箱， 分3个箱\n",
    "data_box = data_price.reshape([3,-1])\n",
    "data_box"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 9.,  9.,  9., 22., 22., 22., 29., 29., 29.])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 用箱均值光滑\n",
    "np.repeat(data_box.mean(axis=1), 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 8.,  8.,  8., 21., 21., 21., 28., 28., 28.])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 用箱中位数光滑\n",
    "np.repeat(np.median(data_box, axis=1), 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\stats\\_binned_statistic.py:607: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.\n",
      "  result = result[core]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "BinnedStatisticResult(statistic=array([1.33333333,        nan, 2.25      ]), bin_edges=array([1., 3., 5., 7.]), binnumber=array([1, 1, 1, 3, 3], dtype=int64))"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from scipy import stats\n",
    "values = [1.0, 1.0, 2.0, 1.5, 3.0]\n",
    "stats.binned_statistic([1, 1, 2, 5, 7], values, 'mean', bins=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([15, 15, 15, 24, 24, 24, 34, 34, 34])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 用箱边界光滑\n",
    "np.repeat(data_box.max(axis=1), 3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. 数据规范化"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.1 最大最小规范化(min-max scaled)\n",
    "假设 $min_A$ 和 $max_{A} $ 分别是属性 $A$ 的最小值和最大值，计算公式如下：\n",
    "\n",
    "$$ v_{i}^{'}  = \\frac{v_i - \\min_A}{\\max_A - \\min_A}(new_{maxA} - new_{minA}) + new_{minA} \\tag{1} $$\n",
    "\n",
    "这样就把 $A$ 的值映射到区间 $[new_{maxA} ,new_{minA}]$ 中的 $v_{i}^{'}$ 中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.5       , 0.        , 1.        ],\n",
       "       [1.        , 0.5       , 0.33333333],\n",
       "       [0.        , 1.        , 0.        ]])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## min-max scale\n",
    "from sklearn import preprocessing\n",
    "X_train = np.array([[ 1., -1.,  2.],\n",
    "                   [ 2.,  0.,  0.],\n",
    "                   [ 0.,  1., -1.]])\n",
    "min_max_scaler = preprocessing.MinMaxScaler()\n",
    "X_train_minmax = min_max_scaler.fit_transform(X_train)\n",
    "X_train_minmax"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.2 Z-score 规范化（零均值规范化）\n",
    "\n",
    "$$ v_{i}^{'}  = \\frac{v_i - \\bar{A}}{\\sigma_A}   \\tag{2} $$\n",
    "\n",
    "通过z-socre规范化，将数值的均值转换成0， 方差转换成1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.        , -1.22474487,  1.33630621],\n",
       "       [ 1.22474487,  0.        , -0.26726124],\n",
       "       [-1.22474487,  1.22474487, -1.06904497]])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_scaled = preprocessing.scale(X_train)\n",
    "X_scaled"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.9343245538895844e-17"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_scaled.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_scaled.var()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.3小数定标\n",
    "通过移动属性 $A$的小数点位置来进行规范化:\n",
    "\n",
    "$$ v_{i}^{'}  = \\frac{v_i}{10^j}   \\tag{3} $$\n",
    "\n",
    "其中 $j$ 是使得 $max(\\left|v^{'}_i \\right|) < 1$ 的最小整数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.1, -0.1,  0.2],\n",
       "       [ 0.2,  0. ,  0. ],\n",
       "       [ 0. ,  0.1, -0.1]])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train / 10"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. 主成分分析\n",
    "主成分分析（principal components anaylysis）主要是利用降维的思想，在损失很少信息的前提下减少数据的维度，通常将转化生成的综合指标称为主成分。每个主成分都是原始变量的线性组合，且各个主成分之间互不相关。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "from matplotlib.font_manager import FontProperties\n",
    "plt.rcParams['font.sans-serif'] = ['simhei']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.1 评价各省市经济效益"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>100固定资产原值实现值（%）</th>\n",
       "      <th>100元固定资产原值实现利税（%）</th>\n",
       "      <th>100元资金实现利税（%）</th>\n",
       "      <th>100元工业总产值实现利税（%）</th>\n",
       "      <th>100元销售收入实现利税（%）</th>\n",
       "      <th>每吨标准煤实现工业产值（元）</th>\n",
       "      <th>每千瓦时电力实现工业产值（元）</th>\n",
       "      <th>全员劳动生产率（元/人.年）</th>\n",
       "      <th>100元流动资金实现产值（元）</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>北京（1）</th>\n",
       "      <td>119.29</td>\n",
       "      <td>30.98</td>\n",
       "      <td>29.92</td>\n",
       "      <td>25.97</td>\n",
       "      <td>15.48</td>\n",
       "      <td>2178.00</td>\n",
       "      <td>3.41</td>\n",
       "      <td>21006.0</td>\n",
       "      <td>296.7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>天津（2）</th>\n",
       "      <td>143.98</td>\n",
       "      <td>31.59</td>\n",
       "      <td>30.21</td>\n",
       "      <td>21.94</td>\n",
       "      <td>12.29</td>\n",
       "      <td>2852.00</td>\n",
       "      <td>4.29</td>\n",
       "      <td>20254.0</td>\n",
       "      <td>363.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>河北（3）</th>\n",
       "      <td>94.80</td>\n",
       "      <td>17.20</td>\n",
       "      <td>17.95</td>\n",
       "      <td>18.14</td>\n",
       "      <td>9.37</td>\n",
       "      <td>1167.00</td>\n",
       "      <td>2.03</td>\n",
       "      <td>12607.0</td>\n",
       "      <td>322.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>山西（4）</th>\n",
       "      <td>65.80</td>\n",
       "      <td>11.08</td>\n",
       "      <td>11.06</td>\n",
       "      <td>12.15</td>\n",
       "      <td>16.84</td>\n",
       "      <td>8.82</td>\n",
       "      <td>1.65</td>\n",
       "      <td>10166.0</td>\n",
       "      <td>284.7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>内蒙（5）</th>\n",
       "      <td>54.79</td>\n",
       "      <td>9.24</td>\n",
       "      <td>9.54</td>\n",
       "      <td>16.86</td>\n",
       "      <td>6.27</td>\n",
       "      <td>894.00</td>\n",
       "      <td>1.80</td>\n",
       "      <td>7564.0</td>\n",
       "      <td>225.4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       100固定资产原值实现值（%）  100元固定资产原值实现利税（%）  100元资金实现利税（%）  100元工业总产值实现利税（%）  \\\n",
       "北京（1）           119.29              30.98          29.92             25.97   \n",
       "天津（2）           143.98              31.59          30.21             21.94   \n",
       "河北（3）            94.80              17.20          17.95             18.14   \n",
       "山西（4）            65.80              11.08          11.06             12.15   \n",
       "内蒙（5）            54.79               9.24           9.54             16.86   \n",
       "\n",
       "       100元销售收入实现利税（%）  每吨标准煤实现工业产值（元）  每千瓦时电力实现工业产值（元）  全员劳动生产率（元/人.年）  \\\n",
       "北京（1）            15.48         2178.00             3.41         21006.0   \n",
       "天津（2）            12.29         2852.00             4.29         20254.0   \n",
       "河北（3）             9.37         1167.00             2.03         12607.0   \n",
       "山西（4）            16.84            8.82             1.65         10166.0   \n",
       "内蒙（5）             6.27          894.00             1.80          7564.0   \n",
       "\n",
       "       100元流动资金实现产值（元）  \n",
       "北京（1）            296.7  \n",
       "天津（2）            363.1  \n",
       "河北（3）            322.2  \n",
       "山西（4）            284.7  \n",
       "内蒙（5）            225.4  "
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.read_excel('./data/主成分分析.xlsx', sheet_name='5-2', index_col = 0)\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PCA(copy=True, iterated_power='auto', n_components=9, random_state=None,\n",
       "  svd_solver='auto', tol=0.0, whiten=False)"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "### 标准化\n",
    "X = (data - data.mean()) / data.std()\n",
    "\n",
    "## 导入主成分库，并先选择所有主成分\n",
    "from sklearn.decomposition import PCA\n",
    "pca = PCA(n_components = X.shape[1])\n",
    "## 训练数据\n",
    "pca.fit(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>方差</th>\n",
       "      <th>贡献度</th>\n",
       "      <th>累计贡献度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6.149885</td>\n",
       "      <td>0.683321</td>\n",
       "      <td>0.683321</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.472892</td>\n",
       "      <td>0.163655</td>\n",
       "      <td>0.846975</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.697420</td>\n",
       "      <td>0.077491</td>\n",
       "      <td>0.924466</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.317825</td>\n",
       "      <td>0.035314</td>\n",
       "      <td>0.959780</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.190044</td>\n",
       "      <td>0.021116</td>\n",
       "      <td>0.980896</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.116045</td>\n",
       "      <td>0.012894</td>\n",
       "      <td>0.993790</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.029118</td>\n",
       "      <td>0.003235</td>\n",
       "      <td>0.997025</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0.024324</td>\n",
       "      <td>0.002703</td>\n",
       "      <td>0.999728</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>0.002448</td>\n",
       "      <td>0.000272</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         方差       贡献度     累计贡献度\n",
       "0  6.149885  0.683321  0.683321\n",
       "1  1.472892  0.163655  0.846975\n",
       "2  0.697420  0.077491  0.924466\n",
       "3  0.317825  0.035314  0.959780\n",
       "4  0.190044  0.021116  0.980896\n",
       "5  0.116045  0.012894  0.993790\n",
       "6  0.029118  0.003235  0.997025\n",
       "7  0.024324  0.002703  0.999728\n",
       "8  0.002448  0.000272  1.000000"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 展示方差解释力度\n",
    "pd.DataFrame({'方差': pca.explained_variance_,\n",
    "              '贡献度':pca.explained_variance_ratio_,\n",
    "             '累计贡献度':pca.explained_variance_ratio_.cumsum()})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.bar(range(9), pca.explained_variance_ratio_)\n",
    "plt.title('贡献度');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PCA(copy=True, iterated_power='auto', n_components=2, random_state=None,\n",
       "  svd_solver='auto', tol=0.0, whiten=False)"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 选择前两个作为主成分\n",
    "pca.n_components = 2\n",
    "pca.fit(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>100固定资产原值实现值（%）</th>\n",
       "      <th>100元固定资产原值实现利税（%）</th>\n",
       "      <th>100元资金实现利税（%）</th>\n",
       "      <th>100元工业总产值实现利税（%）</th>\n",
       "      <th>100元销售收入实现利税（%）</th>\n",
       "      <th>每吨标准煤实现工业产值（元）</th>\n",
       "      <th>每千瓦时电力实现工业产值（元）</th>\n",
       "      <th>全员劳动生产率（元/人.年）</th>\n",
       "      <th>100元流动资金实现产值（元）</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.375559</td>\n",
       "      <td>0.393396</td>\n",
       "      <td>0.375256</td>\n",
       "      <td>0.093534</td>\n",
       "      <td>0.174559</td>\n",
       "      <td>0.372149</td>\n",
       "      <td>0.361616</td>\n",
       "      <td>0.351316</td>\n",
       "      <td>0.362594</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.259512</td>\n",
       "      <td>-0.134374</td>\n",
       "      <td>-0.265294</td>\n",
       "      <td>-0.711329</td>\n",
       "      <td>-0.491327</td>\n",
       "      <td>0.164956</td>\n",
       "      <td>0.225403</td>\n",
       "      <td>0.052364</td>\n",
       "      <td>0.126751</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   100固定资产原值实现值（%）  100元固定资产原值实现利税（%）  100元资金实现利税（%）  100元工业总产值实现利税（%）  \\\n",
       "0         0.375559           0.393396       0.375256          0.093534   \n",
       "1         0.259512          -0.134374      -0.265294         -0.711329   \n",
       "\n",
       "   100元销售收入实现利税（%）  每吨标准煤实现工业产值（元）  每千瓦时电力实现工业产值（元）  全员劳动生产率（元/人.年）  \\\n",
       "0         0.174559        0.372149         0.361616        0.351316   \n",
       "1        -0.491327        0.164956         0.225403        0.052364   \n",
       "\n",
       "   100元流动资金实现产值（元）  \n",
       "0         0.362594  \n",
       "1         0.126751  "
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 主成分系数：\n",
    "pd.DataFrame(pca.components_, columns=data.columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>北京（1）</th>\n",
       "      <td>2.816238</td>\n",
       "      <td>-2.425742</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>天津（2）</th>\n",
       "      <td>3.735832</td>\n",
       "      <td>-0.536483</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>河北（3）</th>\n",
       "      <td>-0.486831</td>\n",
       "      <td>0.097747</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>山西（4）</th>\n",
       "      <td>-2.021997</td>\n",
       "      <td>-0.384570</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>内蒙（5）</th>\n",
       "      <td>-2.976298</td>\n",
       "      <td>0.732496</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>辽宁（6）</th>\n",
       "      <td>-0.418013</td>\n",
       "      <td>-1.267647</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>吉林（7）</th>\n",
       "      <td>-1.613553</td>\n",
       "      <td>0.809633</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>黑龙江（8）</th>\n",
       "      <td>-1.041542</td>\n",
       "      <td>-0.692269</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>上海（9）</th>\n",
       "      <td>7.037722</td>\n",
       "      <td>-1.378583</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>江苏（10）</th>\n",
       "      <td>3.944277</td>\n",
       "      <td>2.806737</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>浙江（11）</th>\n",
       "      <td>4.368433</td>\n",
       "      <td>1.821378</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>安徽（12）</th>\n",
       "      <td>0.072254</td>\n",
       "      <td>0.598317</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>福建（13）</th>\n",
       "      <td>0.512411</td>\n",
       "      <td>0.523114</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>江西（14）</th>\n",
       "      <td>-1.189847</td>\n",
       "      <td>1.252905</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>山东（15）</th>\n",
       "      <td>0.984385</td>\n",
       "      <td>0.362785</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>河南（16）</th>\n",
       "      <td>-1.027543</td>\n",
       "      <td>-0.097753</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>湖北（17）</th>\n",
       "      <td>0.354850</td>\n",
       "      <td>0.300261</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>湖南（18）</th>\n",
       "      <td>-0.043535</td>\n",
       "      <td>-0.387656</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>广东（19）</th>\n",
       "      <td>1.818933</td>\n",
       "      <td>1.314736</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>广西（20）</th>\n",
       "      <td>0.137498</td>\n",
       "      <td>-0.718905</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>四川（21）</th>\n",
       "      <td>-1.409932</td>\n",
       "      <td>0.610274</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>贵州（22）</th>\n",
       "      <td>-2.244185</td>\n",
       "      <td>-1.318495</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>云南（23）</th>\n",
       "      <td>-0.021153</td>\n",
       "      <td>-2.400205</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>陕西（24）</th>\n",
       "      <td>-1.624190</td>\n",
       "      <td>0.406118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>甘肃（25）</th>\n",
       "      <td>-1.645072</td>\n",
       "      <td>-1.748610</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>青海（26）</th>\n",
       "      <td>-3.408246</td>\n",
       "      <td>0.592531</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>宁夏（27）</th>\n",
       "      <td>-3.068127</td>\n",
       "      <td>0.842123</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>新疆（28）</th>\n",
       "      <td>-1.542768</td>\n",
       "      <td>0.285762</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               0         1\n",
       "北京（1）   2.816238 -2.425742\n",
       "天津（2）   3.735832 -0.536483\n",
       "河北（3）  -0.486831  0.097747\n",
       "山西（4）  -2.021997 -0.384570\n",
       "内蒙（5）  -2.976298  0.732496\n",
       "辽宁（6）  -0.418013 -1.267647\n",
       "吉林（7）  -1.613553  0.809633\n",
       "黑龙江（8） -1.041542 -0.692269\n",
       "上海（9）   7.037722 -1.378583\n",
       "江苏（10）  3.944277  2.806737\n",
       "浙江（11）  4.368433  1.821378\n",
       "安徽（12）  0.072254  0.598317\n",
       "福建（13）  0.512411  0.523114\n",
       "江西（14） -1.189847  1.252905\n",
       "山东（15）  0.984385  0.362785\n",
       "河南（16） -1.027543 -0.097753\n",
       "湖北（17）  0.354850  0.300261\n",
       "湖南（18） -0.043535 -0.387656\n",
       "广东（19）  1.818933  1.314736\n",
       "广西（20）  0.137498 -0.718905\n",
       "四川（21） -1.409932  0.610274\n",
       "贵州（22） -2.244185 -1.318495\n",
       "云南（23） -0.021153 -2.400205\n",
       "陕西（24） -1.624190  0.406118\n",
       "甘肃（25） -1.645072 -1.748610\n",
       "青海（26） -3.408246  0.592531\n",
       "宁夏（27） -3.068127  0.842123\n",
       "新疆（28） -1.542768  0.285762"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 主成分\n",
    "y = pd.DataFrame(pca.transform(X), index=data.index)\n",
    "y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7AAAAG4CAYAAAB8cQuGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzs3XlYlNXiB/DvO8wCDIsBYosrmkaRaVguCLhkllvq9WeaabnRwnUpr1gqamFoegXN3XBBUytzi6uUedVUSjEDy9zANUFlH2QZmOX9/cHljXFmYEZNGP1+nofnNuc975njwJ1nvnM2QRRFEBEREREREdV1struABEREREREZEtGGCJiIiIiIjIITDAEhERERERkUNggCUiIiIiIiKHwABLREREREREDoEBloiIiIiIiBwCAywRERERERE5BAZYIiIiIiIicggMsEREREREROQQGGCJiIiIiIjIITDAEhERERERkUOQ13YH7CUIgjeAVgDOiaKYY+M9AoBHAdz8O/tGRERERER0H3MHkCmKolhbHXCoACsIwhAAywFcAtBKEIRRoih+acOtjwK4+nf2jYiIiIiI6AHQEEBGbT25UIvh2S6CINQDkAagqyiKJwVBGA5gtiiKTWy41wOA5s8//4SHh8ff3VUiIiIiIqL7SmFhIRo1agQAnqIoFtZWPxxpBNYdwERRFE/+7/EJAA/Z04CHhwcDLBERERERkYNymAAriuKfADYCgCAICgD/ArCtVjtFRERERERE94zDBNhKgiA8A2A/gHIAT1ipowKgqlLkfg+6RkRERERERH8jRzxG5zcA3QH8AWCtlTofAtBU+eEGTkRERERERA7OYTZxupUgCI0AXAbgLYpi/i3XLI3AXtVoNFwDS0REREREZKfCwkJ4enoCtbyJk8OMwAqC0E0QhPlVivT/+1/jrXVFUSwTRbGw8gc8/5WIiIiIiMjhOUyABXAGwFuCIIT9b/R1LoA9oihqarlfRERERA7t7NmzmDVrFq5fvw5RFKHVaqHX603q6PV6FBUVoby83KQ8JSUFY8eONSmLi4vDqlWrbrs/mZmZiIiIMOvD7YiNjcXRo0fvuB0iqhscagqxIAg9AcSi4vDc7wG8K4pitg33eQDQcAoxERERkbni4mKsWrUKhw8fRmRkJCIjI63WHTduHIxGI9atWweZTAaDwQCtVgu1Wi3VKSsrAwCoVBUrumQyGb744gub+pKXl4dp06YhPDwcAQEBJteSkpKwa9cuREdHm5Tv2rULmzdvhrOzM8aPH4/WrVtL13JychAVFYWRI0eiTZs2NvWBiMzVlSnEDhVgbxcDLBEREVHNfvnlFwQGBqK4uBgKhQJyuRz9+/fHihUr4OvrC51OB4VCAUEQIAgCnJyckJKSgri4OMTGxkIul0MmkyE+Ph7l5eUYO3YsRFGEwWCAXG7b4ReRkZHo06cP2rdvb1KekpKC6OhotGjRAnPmzJHKf/31V3zyySeIiIiAh4cHFixYgNjYWLi7/3UIRVZWFmbMmIF58+bxsyDRbaorAdaRphATERER0V2m1+tRUFAAAGjXrh0EQYCbmxtUKhWcnJwAVIygKhQKuLq6SsG28pqXlxdCQ0ORlJSEt956CwAQEBAgjZ4KgmBzeD19+jQUCoVZeL127RqWL1+OXr16md2ze/dudOvWDe3bt4e/vz86dOiAn3/+2aSOr68vevbsicTERDteGSKqixhgiYiIiB5gP/30E8aMGYP4+HgUFRXZfJ9Op4PBYECTJk0wePBgAMBjjz0GAAgMDETHjh3t7svRo0fRpUsXs3J3d3fExsaicePGZtcuXryIZ555RnrcsmVLnD9/3qxeaGgojhw5YnefiKhuse3rMCIiIiK6LwUHB0Mmk+Hzzz9HYGCg2bpTaz7++GOkpaVBJqsYD6kMtK+99hqAinW1M2bMQGBgoM19ycrKQqdOnczK3dzcrN5TWlqKBg0aSI9dXFyQm5trVs/Ly0saaSYix8UAS0RERPQAupBdhMt5JWjqrUbnzp0RGBgIFxcXm++PioqCVquFUqmETCbD2rVroVKppAA7evRoqNVqFBQUoF69eja16eLiAq1Wa9e/o3J6cyWlUiltIlWVXq+XNpUiIsfFKcRERERED5CCknKMWJ2Mbgt+xMi1x9D13wcwYnUySnTAokWLkJWVZXNbS5YswYIFCwAAqampaNWqlXStsLAQR44cwQcffIDi4mKb2mvYsCHOnDlj17/H3d0dGs1fpyqWlpZaXHObnp6ORx991K62iajuYYAlIiIieoCM35yKpPQck7Kk9BwMm7MRP//8s82jlPv378e5c+fw9ttv4+zZs7hx44a0FlWv10Or1aJ///5o2LAhPv30U9hy8kVISAj27NljcQTVmscffxxnz56VHl+4cAHe3t5m9Xbs2IGuXbva3C4R1U0MsEREREQPiAvZRTiYlg3DLWHSIIr4ef/3eD7khcpjMqpVWFiITZs2Yfr06VAqlVi2bBkGDhwojXwWFlacsOHm5oZJkyahZ8+eEAShxna9vb0RGhqKZcuW2fxvCgoKwq5du5Cfnw+NRoMffvgBzz77rEmdvXv3QqPRoHPnzja3S0R1EwMsERER0QPicl6JxfLy7MvQ5V6B37NByM3NRW5uLvLz85Gfnw+gIpDm5+cjJycHN27cgJubG1auXIl69erh448/hlqtxj/+8Q+pvevXr8PFxQVyuRwuLi4ICgqyuY9Dhw5FUVERYmJiYDQaa6z//PPPIyAgAGFhYRgzZgyaNGlisgNyYmIitm3bhkmTJtkUoomobhNsmc7h6ARB8ACg0Wg0PLyaiIiIHlgXsovQbcGPJmWi0YD8/WsgU7kiZcfnmD9jMrKysuDk5GQS+ERRhF6vh06nQ3x8PDIyMjB37lz4+/vjX//6F1QqFQwGAz766COcO3cOgYGBmDx58m3102g0IikpCcHBwTbfc+bMGWi1WjzzzDMm/U5JSUHz5s35GZDoDhUWFlbO0PAURbGwtvrBAEtERET0ABmxOhlJ6TnSNGJRr4P2fDKefbIFEj8ZZVdbf/zxB5566imTsvT0dKhUKjRq1Oiu9ZmIah8D7D3EAEtERERUQVOiw7jNKTiYli2VhTxeH4uHtoWnq6KaO4noQcYAew8xwBIRERGZuphTjEu5xWjqrUYzH3Vtd4eI6ri6EmDND8kiIiIiovteMx8GVyJyPNyFmIiIiIiIiBwCAywRERERERE5BAZYIiIiIiIicggMsEREREREROQQGGCJiIiIiIjIITDAEhERERERkUNggCUiIiIiIiKHwABLREREREREDoEBloiIiIiIiBwCAywRERERERE5BAZYIiIiIiIicggMsEREREREROQQGGCJiIiIiIjIITDAEhERERERkUNggCUiIiIiIiKHwABLREREREREDoEBloiIiIiIiBwCAywRERERERE5BAZYIiIiIiIicggMsEREREREROQQGGCJiIiIiIjIITDAEhERERERkUNggCUiIiIiIiKHwABLREREREREDoEBloiIiIiIiBwCAywRERERERE5BAZYIiIiIiIicggMsEREREREROQQGGCJiIiIiIjIITDAEhERERERkUNggCUiIiIiIiKHwABLREREREREDoEBloiIiIiIiBwCAywRERERERE5BAZYIiIiIiIicggMsEREREREROQQGGCJiIiIiIjIITDAEhERERERkUNggCUiIiIiIiKHwABLREREREREDoEBloiIiIiIiBwCAywRERERERE5BIcKsIIgvCIIwgVBEPSCIBwVBMG/tvtERERERERE94bDBFhBEJoDWAvgAwCPAbgMIK5WO0VERERERET3jLy2O2AHfwBTRVH8GgAEQVgO4Lva7RIRERERERHdKw4TYEVR/M8tRa0ApNdGX4iIiIiIiOjec5gAW5UgCEoA/wIQa+W6CoCqSpH7vegXERERERER/X0cZg3sLWYDKAKwysr1DwFoqvxcvUf9IiIiIiIior+JwwVYQRB6AHgbwGuiKOqsVJsDwLPKT8N71D0iIiIissOpU6dQXFwsPd6yZQu++eYbAEBeXh5SU1Px/fff47PPPsO8efMAAElJSfj3v/8NjUYDo9EIrVYLg8Fg0q5Op8PNmzeh1+vt6k9mZiYiIiLsvs+S+Ph47N69+47bIaK/OFSAFQTBD8BGAO+IonjKWj1RFMtEUSys/AFw8551koiIiIhsduzYMYwfPx6nT58GAGi1WpSWlgIAduzYgXXr1iE/Px8BAQF48cUXIYoi/P39UVRUhHfeeQfHjh3D//3f/6F///7o27ev9DNw4EC89tprOHnypM19ycvLQ1RUFEaMGAG53HSlXVJSEqZOnWrxPmvXBg0ahEOHDmHv3r0294GIqucwa2AFQXAB8B8AOwDsFATB7X+XikVRFGuvZ0RERER0u9544w00a9YMSUlJ8Pf3N7nm5OSEtm3bYsiQISblXl5emDlzJn799Ve0adMGX375JRQKBXJzcxEWFoZt27ZBFEXodDqoVCrYKjY2Fm+++SYCAgJMylNSUrBw4UK0aNHC7J7qrqnVakyfPh2TJ0+Gv78/HnvsMZv7QkSWOdIIbE9UHKUzFhUjqpU/TWqzU0RERER0Z0JCQjBo0CAMGzYM3333HRITE/HWW29BJjP9qKrX61FcXIySkhIIgoDAwEA4OTlBrVZDqVTCyckJACCTyaBUKqFWq81GUq05ffo0FAoF2rdvb1J+7do1LF++HL169TK7p7pr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zBjpi4/c3FycPXsWjz32GCZMmIBp06YBqJiObu97wO2sw7169SpKS0vh5+dnMpuA63CJiIgcHwNsHeHu7o6NGzdCoVDUePyLKIrQ6/Vwd3fHokWLsGrVKly6dAkdOnTAvn374OLiAjc3N+Tm5iIrKws6nc5s053qzohdueSA3YHj8OHDOH36NLp164bMzEysX78eAwcOxCuvvGJy3/0WOByBVqvFli1bMGHCBAAVo603b96EKIomaxQr3bx5E/Xq1btrz2/tXN+q/Vu8eDGGDh1q127VlRztzN/qREZGorCwENu3b0dpaSnKysqwatUqaUS2rKwMcrkcgiBg79692LRpE06dOoVvvvkGixYtgkqlwsWLFzF27FicOXMGV65ckd4vcnNz4ePjU0MPKjg7O6Njx44oKChAcHCw2UyI//73v9i7dy/mzJkDAJgwYQJkMhkyMjKwevVqrF+/Hj/99BNeeukl5ObmYsOGDcjKyoKPjw8mT55s83uApc2/Klna4EsURURHRyM9PR1yuRwymQyffvqp9Pf8oGz+RUREdD9jgK0jKqd3pqamIioqCt7e3hbrFRQUYNiwYVIwVKlUGDt2LFQqFRYuXIhjx45BFEX8+OOPAIDp06ejrKwMpaWluHjxIhYtWgSg+h1vbydwfPfddwgODpZ2DW7Xrh2mTp2KF198ES4uLib330+Bo6659Vzf8vJyzJ07F23btsWTTz4JoGKq9RdffIGBAwfiiSeeMFsznJmZaXEN5u2q6VzfZcuWwdfX12SavK0c8cxfSyp/bxOmf4JmPmrcvHkT77zzDubPny9Nxy8sLMTo0aMxf/58aZpuWloa5syZA09PT6hUKsyaNQvu7u6YO3cuBgwYgFGjRmHt2rW4evUqMjIyalwfXvmlhouLC1544QU8++yzACpG0TUajVTv6tWryMvLk6YQr1ixAqmpqUhISICrqyv++OMPzJw5EwEBAVi3bh0mTZqEgwcP4pdffoFWq7X5PcDedbh79+5FUVER4uLiIJPJMGPGDOzatUtaj891uERERI6PAbaWVQ0czXzUUCqVaNCgAYYMGWKxfmJiotkUwG+//RZGoxHvvvsutm7dCl9fXzz99NM4f/48OnbsiMOHD+PChQsW22zmY35Uy+0EjpycHHTv3l163Lx5c+j1euTl5Zl8SLxfAkddU1BSjvGbU01G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\n",
      "text/plain": [
       "<Figure size 1100x500 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(dpi=100, figsize=(11,5))\n",
    "ax = plt.subplot(111)\n",
    "y.plot.scatter(0,1, ax=ax, alpha=1)\n",
    "\n",
    "for i in range(y.shape[0]):\n",
    "    ax.annotate(data.index[i], (y.iloc[i,0], y.iloc[i,1]),alpha=0.7)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.2 水泥企业经济效益综合评价"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>固定资产利税率</th>\n",
       "      <th>资金利税率</th>\n",
       "      <th>销售收入利税率</th>\n",
       "      <th>资金利润率</th>\n",
       "      <th>固定资产产值率</th>\n",
       "      <th>流动资金周转天数</th>\n",
       "      <th>万元产值能耗</th>\n",
       "      <th>全员劳动生产率</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>厂家编号及指标</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>琉璃河</th>\n",
       "      <td>16.68</td>\n",
       "      <td>26.75</td>\n",
       "      <td>31.84</td>\n",
       "      <td>18.40</td>\n",
       "      <td>53.25</td>\n",
       "      <td>0.018182</td>\n",
       "      <td>0.034686</td>\n",
       "      <td>1.75</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>邯郸</th>\n",
       "      <td>19.70</td>\n",
       "      <td>27.56</td>\n",
       "      <td>32.94</td>\n",
       "      <td>19.20</td>\n",
       "      <td>59.82</td>\n",
       "      <td>0.018182</td>\n",
       "      <td>0.030377</td>\n",
       "      <td>2.87</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>大同</th>\n",
       "      <td>15.20</td>\n",
       "      <td>23.40</td>\n",
       "      <td>32.98</td>\n",
       "      <td>16.24</td>\n",
       "      <td>46.78</td>\n",
       "      <td>0.015385</td>\n",
       "      <td>0.023987</td>\n",
       "      <td>1.53</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>哈尔滨</th>\n",
       "      <td>7.29</td>\n",
       "      <td>8.97</td>\n",
       "      <td>21.30</td>\n",
       "      <td>4.76</td>\n",
       "      <td>34.39</td>\n",
       "      <td>0.016129</td>\n",
       "      <td>0.025458</td>\n",
       "      <td>1.63</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>华新</th>\n",
       "      <td>29.45</td>\n",
       "      <td>56.49</td>\n",
       "      <td>40.74</td>\n",
       "      <td>43.68</td>\n",
       "      <td>75.32</td>\n",
       "      <td>0.014493</td>\n",
       "      <td>0.037481</td>\n",
       "      <td>2.14</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         固定资产利税率  资金利税率  销售收入利税率  资金利润率  固定资产产值率  流动资金周转天数    万元产值能耗  全员劳动生产率\n",
       "厂家编号及指标                                                                      \n",
       "琉璃河        16.68  26.75    31.84  18.40    53.25  0.018182  0.034686     1.75\n",
       "邯郸         19.70  27.56    32.94  19.20    59.82  0.018182  0.030377     2.87\n",
       "大同         15.20  23.40    32.98  16.24    46.78  0.015385  0.023987     1.53\n",
       "哈尔滨         7.29   8.97    21.30   4.76    34.39  0.016129  0.025458     1.63\n",
       "华新         29.45  56.49    40.74  43.68    75.32  0.014493  0.037481     2.14"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_2 = pd.read_excel('./data/主成分分析.xlsx', sheet_name='5-3', index_col = 0)\n",
    "data_2.set_index('厂家编号及指标', inplace=True)\n",
    "## 将 '流动资金周转天数' 和 '万元产值能耗' 取倒数\n",
    "data_2['流动资金周转天数'] = 1 / data_2['流动资金周转天数']\n",
    "data_2['万元产值能耗'] = 1 / data_2['万元产值能耗']\n",
    "data_2.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>固定资产利税率</th>\n",
       "      <th>资金利税率</th>\n",
       "      <th>销售收入利税率</th>\n",
       "      <th>资金利润率</th>\n",
       "      <th>固定资产产值率</th>\n",
       "      <th>流动资金周转天数</th>\n",
       "      <th>万元产值能耗</th>\n",
       "      <th>全员劳动生产率</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>厂家编号及指标</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>琉璃河</th>\n",
       "      <td>-0.376748</td>\n",
       "      <td>-0.357946</td>\n",
       "      <td>-0.113559</td>\n",
       "      <td>-0.366694</td>\n",
       "      <td>-0.038794</td>\n",
       "      <td>1.193347</td>\n",
       "      <td>1.426821</td>\n",
       "      <td>-0.277122</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>邯郸</th>\n",
       "      <td>0.088158</td>\n",
       "      <td>-0.293876</td>\n",
       "      <td>0.050803</td>\n",
       "      <td>-0.287323</td>\n",
       "      <td>0.356157</td>\n",
       "      <td>1.193347</td>\n",
       "      <td>0.289035</td>\n",
       "      <td>2.253119</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>大同</th>\n",
       "      <td>-0.604583</td>\n",
       "      <td>-0.622925</td>\n",
       "      <td>0.056779</td>\n",
       "      <td>-0.580995</td>\n",
       "      <td>-0.427733</td>\n",
       "      <td>-0.373281</td>\n",
       "      <td>-1.398099</td>\n",
       "      <td>-0.774133</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>哈尔滨</th>\n",
       "      <td>-1.822267</td>\n",
       "      <td>-1.764312</td>\n",
       "      <td>-1.688443</td>\n",
       "      <td>-1.719968</td>\n",
       "      <td>-1.172548</td>\n",
       "      <td>0.043644</td>\n",
       "      <td>-1.009542</td>\n",
       "      <td>-0.548219</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>华新</th>\n",
       "      <td>1.589096</td>\n",
       "      <td>1.994436</td>\n",
       "      <td>1.216277</td>\n",
       "      <td>2.141428</td>\n",
       "      <td>1.287927</td>\n",
       "      <td>-0.872786</td>\n",
       "      <td>2.164810</td>\n",
       "      <td>0.603944</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          固定资产利税率     资金利税率   销售收入利税率     资金利润率   固定资产产值率  流动资金周转天数    万元产值能耗  \\\n",
       "厂家编号及指标                                                                         \n",
       "琉璃河     -0.376748 -0.357946 -0.113559 -0.366694 -0.038794  1.193347  1.426821   \n",
       "邯郸       0.088158 -0.293876  0.050803 -0.287323  0.356157  1.193347  0.289035   \n",
       "大同      -0.604583 -0.622925  0.056779 -0.580995 -0.427733 -0.373281 -1.398099   \n",
       "哈尔滨     -1.822267 -1.764312 -1.688443 -1.719968 -1.172548  0.043644 -1.009542   \n",
       "华新       1.589096  1.994436  1.216277  2.141428  1.287927 -0.872786  2.164810   \n",
       "\n",
       "          全员劳动生产率  \n",
       "厂家编号及指标            \n",
       "琉璃河     -0.277122  \n",
       "邯郸       2.253119  \n",
       "大同      -0.774133  \n",
       "哈尔滨     -0.548219  \n",
       "华新       0.603944  "
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 标准化 \n",
    "X_2 = (data_2 - data_2.mean()) / data_2.std()\n",
    "X_2.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PCA(copy=True, iterated_power='auto', n_components=8, random_state=None,\n",
       "  svd_solver='auto', tol=0.0, whiten=False)"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 主成分分析\n",
    "pca_2 = PCA(n_components=X_2.shape[1])\n",
    "pca_2.fit(X_2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>方差</th>\n",
       "      <th>贡献度</th>\n",
       "      <th>累计贡献度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>4.860635</td>\n",
       "      <td>0.607579</td>\n",
       "      <td>0.607579</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.269174</td>\n",
       "      <td>0.158647</td>\n",
       "      <td>0.766226</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.837004</td>\n",
       "      <td>0.104626</td>\n",
       "      <td>0.870852</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.517097</td>\n",
       "      <td>0.064637</td>\n",
       "      <td>0.935489</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.378175</td>\n",
       "      <td>0.047272</td>\n",
       "      <td>0.982761</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.115468</td>\n",
       "      <td>0.014434</td>\n",
       "      <td>0.997194</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.021128</td>\n",
       "      <td>0.002641</td>\n",
       "      <td>0.999835</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0.001318</td>\n",
       "      <td>0.000165</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         方差       贡献度     累计贡献度\n",
       "0  4.860635  0.607579  0.607579\n",
       "1  1.269174  0.158647  0.766226\n",
       "2  0.837004  0.104626  0.870852\n",
       "3  0.517097  0.064637  0.935489\n",
       "4  0.378175  0.047272  0.982761\n",
       "5  0.115468  0.014434  0.997194\n",
       "6  0.021128  0.002641  0.999835\n",
       "7  0.001318  0.000165  1.000000"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 展示方差解释力度\n",
    "pd.DataFrame({'方差': pca_2.explained_variance_,\n",
    "              '贡献度':pca_2.explained_variance_ratio_,\n",
    "             '累计贡献度':pca_2.explained_variance_ratio_.cumsum()})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>固定资产利税率</th>\n",
       "      <th>资金利税率</th>\n",
       "      <th>销售收入利税率</th>\n",
       "      <th>资金利润率</th>\n",
       "      <th>固定资产产值率</th>\n",
       "      <th>流动资金周转天数</th>\n",
       "      <th>万元产值能耗</th>\n",
       "      <th>全员劳动生产率</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.434067</td>\n",
       "      <td>0.407766</td>\n",
       "      <td>0.390911</td>\n",
       "      <td>0.420727</td>\n",
       "      <td>0.356854</td>\n",
       "      <td>0.191631</td>\n",
       "      <td>0.290517</td>\n",
       "      <td>0.258889</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.016487</td>\n",
       "      <td>-0.351123</td>\n",
       "      <td>0.072241</td>\n",
       "      <td>-0.311078</td>\n",
       "      <td>0.000221</td>\n",
       "      <td>0.686453</td>\n",
       "      <td>-0.069141</td>\n",
       "      <td>0.546310</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.261567</td>\n",
       "      <td>0.040663</td>\n",
       "      <td>-0.369589</td>\n",
       "      <td>-0.041125</td>\n",
       "      <td>0.198903</td>\n",
       "      <td>0.377485</td>\n",
       "      <td>0.701934</td>\n",
       "      <td>-0.341867</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    固定资产利税率     资金利税率   销售收入利税率     资金利润率   固定资产产值率  流动资金周转天数    万元产值能耗  \\\n",
       "0  0.434067  0.407766  0.390911  0.420727  0.356854  0.191631  0.290517   \n",
       "1 -0.016487 -0.351123  0.072241 -0.311078  0.000221  0.686453 -0.069141   \n",
       "2 -0.261567  0.040663 -0.369589 -0.041125  0.198903  0.377485  0.701934   \n",
       "\n",
       "    全员劳动生产率  \n",
       "0  0.258889  \n",
       "1  0.546310  \n",
       "2 -0.341867  "
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 选择前3个主成分\n",
    "pca_2.n_components = 3\n",
    "pca_2.fit(X_2)\n",
    "\n",
    "## 主成分系数矩阵\n",
    "pd.DataFrame(pca_2.components_, columns = data_2.columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>y1</th>\n",
       "      <th>名次</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>厂家编号及指标</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>琉璃河</th>\n",
       "      <td>0.049449</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>邯郸</th>\n",
       "      <td>0.840463</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>大同</th>\n",
       "      <td>-1.569438</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>哈尔滨</th>\n",
       "      <td>-3.739361</td>\n",
       "      <td>15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>华新</th>\n",
       "      <td>3.957065</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>湘乡</th>\n",
       "      <td>3.889455</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>柳州</th>\n",
       "      <td>1.611045</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>峨嵋</th>\n",
       "      <td>-2.804575</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>耀县</th>\n",
       "      <td>-0.474240</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>永登</th>\n",
       "      <td>0.663090</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>工源</th>\n",
       "      <td>-0.269528</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>抚顺</th>\n",
       "      <td>-0.752096</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>大连</th>\n",
       "      <td>-1.066534</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>江南</th>\n",
       "      <td>1.723416</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>江油</th>\n",
       "      <td>-2.058212</td>\n",
       "      <td>13</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               y1  名次\n",
       "厂家编号及指标              \n",
       "琉璃河      0.049449   7\n",
       "邯郸       0.840463   5\n",
       "大同      -1.569438  12\n",
       "哈尔滨     -3.739361  15\n",
       "华新       3.957065   1\n",
       "湘乡       3.889455   2\n",
       "柳州       1.611045   4\n",
       "峨嵋      -2.804575  14\n",
       "耀县      -0.474240   9\n",
       "永登       0.663090   6\n",
       "工源      -0.269528   8\n",
       "抚顺      -0.752096  10\n",
       "大连      -1.066534  11\n",
       "江南       1.723416   3\n",
       "江油      -2.058212  13"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 得到第一个主成分， 并排名\n",
    "y_2 = pca_2.transform(X_2)\n",
    "index = y_2[:,0].argsort()[::-1].argsort() ## argsort() 返回的是从小到大值对应的序号，所有用两次返回对应大小排序值\n",
    "pd.DataFrame({'y1': y_2[:,0], '名次': index+1}, index=data_2.index)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. 练习"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 练习1\n",
    "对数据 13,15,16,16,19,20,20,21,22,22,25,25,25,25,30,33,33,35,35,35,35,36,40,45,46,52,70 使用深度为 3 的箱，用箱均值光滑数据。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([13, 15, 16, 16, 19, 20, 20, 21, 22, 22, 25, 25, 25, 25, 30, 33, 33,\n",
       "       35, 35, 35, 35, 36, 40, 45, 46, 52, 70])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = np.array([13,15,16,16,19,20,20,21,22,22,25,25,25,25,30,33,33,35,35,35,35,36,40,45,46,52,70])\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([14.66666667, 14.66666667, 14.66666667, 18.33333333, 18.33333333,\n",
       "       18.33333333, 21.        , 21.        , 21.        , 24.        ,\n",
       "       24.        , 24.        , 26.66666667, 26.66666667, 26.66666667,\n",
       "       33.66666667, 33.66666667, 33.66666667, 35.        , 35.        ,\n",
       "       35.        , 40.33333333, 40.33333333, 40.33333333, 56.        ,\n",
       "       56.        , 56.        ])"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.repeat(data.reshape([-1, 3]).mean(axis=1), 3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 练习2\n",
    "根据练习1的数据\n",
    "- 使用最小-最大规范化将 35 映射到 $[0,1]$ 区间\n",
    "- 使用z分数规范化变化 35\n",
    "- 使用小数定标规范化变换 35"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.38596491228070173"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# min-max\n",
    "(35 - data.min()) / (data.max() - data.min())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.3966110348537352"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## z-score\n",
    "(35 - data.mean()) / data.std()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.35"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## decimal \n",
    "35 / 100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  },
  "toc": {
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "toc_cell": true,
   "toc_position": {},
   "toc_section_display": "block",
   "toc_window_display": true
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
